package com.ihg.hiex.admin.service.session;

import java.util.List;
import java.util.Map;

import com.ihg.hiex.admin.entity.security.Login;
import com.ihg.hiex.entity.session.Session;
import com.ihg.hiex.entity.session.after.SessionReport;
import com.ihg.hiex.entity.session.during.SessionAnchorScore;
import com.ihg.hiex.entity.session.during.SessionAnchorScoreType;
import com.ihg.hiex.entity.session.during.SessionCalibration;
import com.ihg.hiex.entity.session.during.SessionCalibrationAnchorScore;
import com.ihg.hiex.entity.session.during.SessionCalibrationComment;
import com.ihg.hiex.entity.session.during.SessionCalibrationCompetency;
import com.ihg.hiex.entity.session.during.SessionCalibrationRecommendation;
import com.ihg.hiex.entity.session.during.SessionCalibrationStatus;
import com.ihg.hiex.entity.session.during.SessionCompetencyScore;
import com.ihg.hiex.entity.session.during.SessionExercise;
import com.ihg.hiex.entity.session.during.SessionExerciseReflection;
import com.ihg.hiex.entity.session.during.SessionInBasket;
import com.ihg.hiex.entity.session.during.SessionInBasketAnswer;
import com.ihg.hiex.entity.session.during.report.SessionReportComment;
import com.ihg.hiex.entity.session.during.report.SessionReportCompetency;
import com.ihg.hiex.entity.session.during.report.SessionReportRecommendation;
import com.ihg.hiex.entity.session.during.report.SessionReportWriting;
import com.ihg.hiex.entity.session.meeting.SessionMeeting;
import com.ihg.hiex.entity.session.task.SessionTask;
import com.ihg.hiex.entity.session.task.Status;
import com.ihg.hiex.entity.user.Assessor;
import com.ihg.hiex.entity.user.Delegate;

/**
 * 
 * @author dan
 *
 */
public interface SessionDuringService {
    
    /**
     * 
     * @param sessionCompetencyScore
     * @return
     */
    public List<SessionAnchorScore> listSessionAnchorScore(SessionCompetencyScore sessionCompetencyScore);
    
    /**
     * 
     * @param sessionCompetencyScoress
     * @return
     */
    public List<SessionAnchorScore> listSessionAnchorScore(List<SessionCompetencyScore> sessionCompetencyScoress);
    
    /**
     * 
     * @param sessionInBasket
     * @param name
     * @return
     */
    public Map<String, List<SessionInBasketAnswer>> listSessionInBasketAnswer(SessionInBasket sessionInBasket, String name);
    
    /**
     * 
     * @param sessionInBasket
     * @return
     */
    public Map<String, Map<String, List<SessionInBasketAnswer>>> listSessionInBasketAnswer(SessionInBasket sessionInBasket);
    
    /**
     * 
     * @param sessionInBaskets
     * @return
     */
    public Map<String, List<SessionInBasketAnswer>> listSessionInBasketAnswer(List<SessionInBasket> sessionInBaskets);
    
    /**
     * 
     * @param session
     * @param delegateIds
     * @return
     */
    public List<SessionCalibration> listSessionCalibration(Session session, List<Long> delegateIds);
    
    /**
     * list sessionExercise # Map<name, exercise>
     * 
     * @param session
     * @param delegate
     * @param names
     * @return
     */
    public Map<String, SessionExercise> listSessionExercise(Session session, Delegate delegate, List<String> names);
    
    /**
     * 
     * @param sessionCalibrations
     * @return
     */
    public Map<String, Map<String, SessionCalibrationCompetency>> listSessionCalibrationCompetency(List<SessionCalibration> sessionCalibrations);
    
    /**
     * 
     * @param sessionCalibrations
     * @return
     */
    public Map<String, List<SessionCalibrationCompetency>> listCalibrationCompetency(List<SessionCalibration> sessionCalibrations);
    
    /**
     * 
     * @param sessionCalibration
     * @return
     */
    public List<SessionCalibrationCompetency> listSessionCalibrationCompetency(SessionCalibration sessionCalibration);
    /**
     * 
     * @param sessionCalibrations
     * @return
     */
    public Map<String, SessionCalibrationComment> listSessionCalibrationComment(List<SessionCalibration> sessionCalibrations);
    
    /**
     * 
     * @param sessionCalibrations
     * @return
     */
    public Map<String, SessionCalibrationRecommendation> listSessionCalibrationRecommendation(List<SessionCalibration> sessionCalibrations);
    
    /**
     * 
     * @param sessionCalibrations
     * @return
     */
    public Map<String, SessionReportWriting> listSessionReportWriting(List<SessionCalibration> sessionCalibrations);
    
    /**
     * 
     * @param sessionCalibration
     * @return
     */
    public SessionCalibrationRecommendation loadSessionCalibrationRecommendation(SessionCalibration sessionCalibration);
    
    /**
     * 
     * @param sessionCalibrationCompetency
     * @return
     */
    public List<SessionCalibrationAnchorScore> listCalibrationAnchorScore(SessionCalibrationCompetency sessionCalibrationCompetency);
    
    /**
     * 
     * @param session
     * @param assessors
     * @param delegate
     * @param competencyName
     * @return
     */
    public Map<String, Map<String, Map<String, SessionAnchorScore>>> listMeetingAnchorScore(Session session, Assessor[] assessors, Delegate delegate, String competencyName);
    
    /**
     * 
     * @param session
     * @param assessors
     * @param delegate
     * @param competencyName
     * @return
     */
    public Map<String, List<SessionAnchorScore>> listMeetingAnchorScores(Session session, Assessor[] assessors, Delegate delegate, String competencyName);
    
    /**
     * 
     * @param session
     * @param delegate
     * @param competencyName
     * @return
     */
    public Map<String, List<SessionAnchorScore>> listMeetingAnchorScores(Session session, Delegate delegate, String competencyName);
    
    /**
     * 
     * @param session
     * @param meetingName
     * @return
     */
    public Map<String, Map<String, SessionAnchorScore>> listMeetingAnchorScore(Session session, String meetingName);
    
    /**
     * 
     * @param session
     * @param meetingName
     * @return
     */
    public Map<String, Map<String, List<SessionAnchorScore>>> listMeetingAnchorScores(Session session, String meetingName);
    
    /**
     * 
     * @param session
     * @param delegate
     * @param competencyName
     * @return
     */
    public List<SessionAnchorScore> listInBasketAnchorScore(Session session, Delegate delegate, String competencyName);
    
    /**
     * 
     * @param session
     * @param assessors
     * @param delegate
     * @param competencyName
     * @return
     */
    public Map<String, Map<String, SessionAnchorScore>> listInBasketAnchorScore(Session session, Assessor[] assessors, Delegate delegate, String competencyName);
    
    /**
     * 
     * @param session
     * @param assessors
     * @param delegate
     * @param competencyName
     * @return
     */
    public Map<String, List<SessionAnchorScore>> listInBasketAnchorScores(Session session, Assessor[] assessors, Delegate delegate, String competencyName);
    
    /**
     * 
     * @param session
     * @return
     */
    public Map<String, Map<String, SessionAnchorScore>> listInBasketAnchorScore(Session session);
    
    /**
     * 
     * @param session
     * @return
     */
    public Map<String, Map<String, List<SessionAnchorScore>>> listInBasketAnchorScores(Session session);
    
    /**
     * 
     * @param session
     * @return
     */
    public List<SessionExercise> listSessionExercise(Session session);
    
    /**
     * 
     * @param session
     * @param delegate
     * @return
     */
    public Map<String, List<SessionCompetencyScore>> listSessionCompetencyScore(Session session, Delegate delegate);
    
    /**
     * 
     * @param sessionExercises
     * @return
     */
    public List<SessionCompetencyScore> listSessionCompetencyScore(List<SessionExercise> sessionExercises);
    
    /**
     * 
     * @param competencyNames
     * @param session
     * @param delegate
     * @return
     */
    public Map<String, SessionCompetencyScore> listSessionCompetencyScore(String[] competencyNames, Session session, Delegate delegate);
    
    /**
     * 
     * @param sessionStatus
     * @param calibrationStatus
     * @return
     */
    public List<SessionReportWriting> listSessionReportWriting(com.ihg.hiex.entity.session.Status sessionStatus, SessionCalibrationStatus calibrationStatus);
    
    /**
     * 
     * @param session
     * @param assessor
     * @param delegate
     * @param name
     * @return
     */
    public SessionExercise loadSessionExercise(Session session, Assessor assessor, Delegate delegate, String name);
    
    /**
     * 
     * @param exerciseId
     * @return
     */
    public SessionExercise loadSessionExercise(Long exerciseId);
    
    /**
     * 
     * @param session
     * @param name
     * @return
     */
    public List<SessionInBasket> listSessionInbasket(Session session, String name);
    
    /**
     * 
     * @param session
     * @param assessor
     * @param delegate
     * @param name
     * @return
     */
    public SessionInBasket loadSessionInbasket(Session session, Assessor assessor, Delegate delegate, String name);
    
    /**
     * 
     * @param sessionInbasketId
     * @return
     */
    public SessionInBasket loadSessionInbasket(Long sessionInbasketId);
    
    /**
     * 
     * @param session
     * @param delegate
     * @return
     */
    public SessionInBasket loadSessionInbasket(Session session, Delegate delegate);
    
    /**
     * 
     * @param sessionExercise
     * @param competencyName
     * @return
     */
    public SessionCompetencyScore loadSessionCompetencyScore(SessionExercise sessionExercise, String competencyName);
    
    /**
     * 
     * @param sessionInBasket
     * @param competencyName
     * @return
     */
    public SessionCompetencyScore loadSessionCompetencyScore(SessionInBasket sessionInBasket, String competencyName);
    
    /**
     * 
     * @param competencyId
     * @return
     */
    public SessionCompetencyScore loadSessionCompetencyScore(Long competencyId);
    
    /**
     * 
     * @param sessionExercise
     * @return
     */
    public SessionCompetencyScore loadSessionCompetencyScore(SessionExercise sessionExercise);
    
    /**
     * 
     * @param session
     * @param delegate
     * @return
     */
    public SessionInBasket loadSessionInBasket(Session session, Delegate delegate);
    
    /**
     * 
     * @param calibrationId
     * @return
     */
    public SessionCalibration loadSessionCalibration(Long calibrationId);
    
    /**
     * 
     * @param session
     * @param delegate
     * @return
     */
    public SessionCalibration loadSessionCalibration(Session session, Delegate delegate);
    
    /**
     * 
     * @param sessionCalibration
     * @param name
     * @return
     */
    public SessionCalibrationCompetency loadSessionCalibrationCompetency(SessionCalibration sessionCalibration, String name);
    
    /**
     * 
     * @param competencyId
     * @return
     */
    public SessionCalibrationCompetency loadSessionCalibrationCompetency(Long competencyId);
    
    /**
     * 
     * @param session
     * @param delegate
     * @return
     */
    public SessionReport loadSessionReport(Session session, Delegate delegate);
    
    /**
     * 
     * @param sessionExercise
     * @return
     */
    public int countFinishCompetencyScore(SessionExercise sessionExercise);
    
    /**
     * 
     * @param sessionInBasket
     * @return
     */
    public int countFinishCompetencyScore(SessionInBasket sessionInBasket);
    
    /**
     * 
     * @param session
     * @param name
     * @param owner
     * @param delegate
     * @return
     */
    public SessionMeeting loadSessionMeeting(Session session, String name, Long owner, Long delegate);
    
    /**
     * 
     * @param competencyScore
     * @param effective
     * @param inEffective
     * @param anchorScores
     */
    public void score(SessionCompetencyScore competencyScore, String effective, String inEffective, List<String> anchorScores);
    
    /**
     * 
     * @param sessionExercise
     */
    public void summary(SessionExercise sessionExercise);

    /**
     * 
     * @param sessionExercise
     * @return
     */
    public SessionExerciseReflection loadExerciseReflection(SessionExercise sessionExercise);
    
    /**
     * 
     * @param sessionCalibration
     * @return
     */
    public SessionCalibrationComment loadSessionCalibrationComment(SessionCalibration sessionCalibration);

    /**
     * 
     * @param sessionExercise
     * @param delegate
     * @param sessionExerciseReflection
     * @param sessionTask
     */
    public void selfReflection(SessionExercise sessionExercise, Delegate delegate, SessionExerciseReflection sessionExerciseReflection, SessionTask sessionTask);
    
    /**
     * 
     * @param sessionInBasket
     * @param sessionInBasketAnswer
     */
    public void saveInBasketAnswer(SessionInBasket sessionInBasket, SessionInBasketAnswer sessionInBasketAnswer);
    
    /**
     * 
     * @param sessionInBasketAnswer
     */
    public void deleteInBasketAnswer(SessionInBasketAnswer sessionInBasketAnswer);
    
    /**
     * 
     * @param sessionInBasket
     * @param name
     */
    public void submitInBasketAnswer(SessionInBasket sessionInBasket, String name);
    
    /**
     * 
     * @param sessionCalibrationCompetency
     * @param anchorScores
     * @param strong
     * @param weak
     * @param sessionTask
     */
    public void competencySubmit(SessionCalibrationCompetency sessionCalibrationCompetency, List<SessionCalibrationAnchorScore> anchorScores, List<Long> strong, List<Long> weak, SessionTask sessionTask);
    
    /**
     * 
     * @param competencies
     * @param names
     * @param results
     */
    public void editCompetency(List<SessionCalibrationCompetency> competencies, List<String> names, List<SessionAnchorScoreType> results);
    
    /**
     * 
     * @param sessionCalibrationComment
     * @param sessionTask
     */
    public void commentChoose(SessionCalibrationComment sessionCalibrationComment, SessionTask sessionTask);
    
    /**
     * 
     * @param sessionCalibrationComment
     * @param chooses
     * @param chooseCommets
     * @param sessionTask
     */
    public void commentSubmit(SessionCalibrationComment sessionCalibrationComment, List<String> chooses, List<String> chooseCommets, SessionTask sessionTask);
    
    /**
     * 
     * @param calibration
     * @param sessionTask
     * @param login
     */
    public void reportSubmit(SessionCalibration calibration, SessionTask sessionTask, Login login);
    
    /**
     * 
     * @param sessionCalibration
     * @param recommendation
     * @param sessionTask
     */
    public void recommendationSubmit(SessionCalibration sessionCalibration, SessionCalibrationRecommendation recommendation, SessionTask sessionTask);
    
    /**
     * 
     * @param competencies
     * @return
     */
    public Map<String, Map<String, List<SessionCalibrationAnchorScore>>> listSessionCalibrationAnchorScore(List<SessionCalibrationCompetency> competencies);

    /**
     * 
     * @param session
     * @param delegate
     * @param pptUrl
     */
    public void gmPptUpload(Session session, Delegate delegate, String pptUrl);
    
    /**
     * 
     * @param competencies
     * @param strong
     * @return
     */
    public Map<String, List<SessionCalibrationAnchorScore>> listSessionCalibrationAnchorScores(List<SessionCalibrationCompetency> competencies, boolean strong);

    /**
     * 
     * @param delegateIds
     * @param answers
     * @return
     */
    public Map<Long, Status> generateAnswerStatus(List<Long> delegateIds, Map<String, List<SessionInBasketAnswer>> answers);
    
    /**
     * 
     * @param sessionCalibration
     * @param sessionReportRecommendation
     * @param login
     */
    public void editRecommendation(SessionCalibration sessionCalibration, SessionReportRecommendation sessionReportRecommendation, Login login);
    
    /**
     * 
     * @param sessionCalibration
     * @param sessionReportComment
     * @param chooseComments
     * @param login
     */
    public void editComment(SessionCalibration sessionCalibration, SessionReportComment sessionReportComment, List<String> chooseComments, String chooseValue, Login login);

    /**
     * 
     * @param sessionCalibration
     * @param sessionReportCompetency
     * @param login
     */
    public void editEffective(SessionCalibration sessionCalibration, SessionReportCompetency sessionReportCompetency, Login login);
    
    /**
     * 
     * @param reportWriting
     */
    public void supervisorReportSubmit(SessionReportWriting reportWriting);
    
    /**
     * 
     * @param reportWriting
     */
    public void adminReportSubmit(SessionReportWriting reportWriting);
    
    /**
     * 
     * @param scores
     * @return
     */
    public String generateMeetingScore(List<SessionAnchorScore> scores);
    
}
